﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using LCTNote.Services;
using LCTNote.Models.ViewModels;
using LCTNote.Models.DataModels;
using DevComponents.AdvTree;
using LCTNote.CustomObject;


namespace LCTNote.Business
{
    static class ThuMucBusiness
    {
        /// <summary>
        /// Lấy thư mục theo mã người dùng
        /// </summary>
        /// <param name="maNguoiDung">Mã người dùng</param>
        /// <returns>Node - cây thư mục của người dùng</returns>
        public static Node layCayThuMuc(int maNguoiDung)
        {
            //Lấy danh sách thư mục
            List<ThuMucViewModel> thuMucs = ThuMucService.layThuMucTheoMaNguoiDung(maNguoiDung);
            
            //Kiểm tra
            if (thuMucs == null)
            {
                return null;
            }

            //Lấy nút gốc
            Node nut = new Node(thuMucs[0].tenThuMuc);
            nut.Tag = thuMucs[0].ma;
            nut.ImageIndex = 0;
            nut.ImageExpandedIndex = 1;

            //Xóa thư mục vừa lấy
            thuMucs.RemoveAt(0);

            //Lấy các nút con của nút vừa thêm
            layThuMucCon(ref thuMucs, ref nut, 0);

            return nut;
        }

        /// <summary>
        /// Lấy thư mục con đưa vào nút
        /// </summary>
        /// <param name="thuMucs">Mảng chứa thư mục</param>
        /// <param name="nut">Nút tìm thư mục con</param>
        /// <param name="viTri">Vị trí bắt đầu</param>
        private static void layThuMucCon(ref List<ThuMucViewModel> thuMucs, ref Node nut, int viTri)
        {
            //Lấy mã của thư mục cha (vị trí trước vị trí bắt đầu)
            int maThuMuc = (int)nut.Tag;

            //Lấy tất cả các node của thư mục
            for (int i = viTri; i < thuMucs.Count; )
            {
                //Kiểm tra xem thư mục được chọn có phải là thư mục con của thư mục hiện tại ko
                if (thuMucs[i].maThuMucCha == maThuMuc)
                {
                    //Thêm nút vào danh sách nút con của nút hiện tại
                    Node nutTam = new Node(thuMucs[i].tenThuMuc);
                    nutTam.Tag = thuMucs[i].ma;
                    nutTam.ImageIndex = 0;
                    nutTam.ImageExpandedIndex = 1;

                    //Xóa nút vừa lấy
                    thuMucs.RemoveAt(i);

                    //Lấy nút con của nút vừa thêm
                    layThuMucCon(ref thuMucs, ref nutTam, i);

                    //Đưa nút vào nút cha
                    nut.Nodes.Add(nutTam);
                }
                else
                {
                    i++;        
                }
            }
        }

        /// <summary>
        /// Lấy dữ liệu của thư mục
        /// </summary>
        /// <param name="maThuMucCha">Mã thư mục</param>
        public static LCTNote_TileItem[] layDuLieuThuMuc(int maThuMuc, Action<object, EventArgs> xuLy_Click)
        {
            //Lấy danh sách thư mục
            List<ThuMucViewModel> thuMucs = ThuMucService.layThuMucTheoMaThuMucCha(maThuMuc);

            //Kiểm tra
            if (thuMucs == null)
            {
                return null;
            }

            //Lấy sách bản ghi
            List<BanGhiViewModel> banGhis = BanGhiService.layBanGhiTheoMaThuMuc(maThuMuc);

            //Kiểm tra 
            if (banGhis == null)
            {
                return null;
            }

            //Tạo ra mảng items trả về
            LCTNote_TileItem[] items = new LCTNote_TileItem[thuMucs.Count + banGhis.Count];

            int i = 0;
            //Duyệt, tạo danh sách thư mục
            foreach(ThuMucViewModel thuMuc in thuMucs)
            {
                items[i] = new LCTNote_TileItem(thuMuc.ma, 1, thuMuc.tenThuMuc, thuMuc.moTaThuMuc, xuLy_Click);
                i++;
            }
            //Duyệt, tạo danh sách bản ghi
            foreach(BanGhiViewModel banGhi in banGhis)
            {
                items[i] = new LCTNote_TileItem(banGhi.ma, 2, banGhi.tieuDe, banGhi.noiDung, xuLy_Click);
                i++;
            }

            return items;
        }

        /// <summary>
        /// Thêm thư mục
        /// </summary>
        /// <param name="thuMuc">Thư mục cần thêm</param>
        /// <returns>Mã thư mục - 0 nếu false</returns>
        public static int themThuMuc(ThuMucDataModel thuMuc)
        {
            return ThuMucService.themThuMuc(thuMuc);
        }

        /// <summary>
        /// Lấy thư mục theo mã thư mục
        /// </summary>
        /// <param name="maThuMuc">Mã thư mục</param>
        /// <returns></returns>
        public static ThuMucViewModel layThuMucTheoMaThuMuc(int maThuMuc)
        {
            return ThuMucService.layThuMucTheoMaThuMuc(maThuMuc);
        }
    }
}
